#!/usr/bin/env python
#-*-coding:utf-8-*-

################################################################################
# DOCS
################################################################################

"""Ssh wrapper that holds which username is the default to log to a specific 
system

[user] overrides the default user for the server
"""

################################################################################
# IMPORTS
################################################################################

import optparse
import os
try:
    import cPickle as pickle
except ImportError:
    import pickle

################################################################################
# META
################################################################################

__prj__ = "connect"
__version__ = "1.0"
__author__ = "Flor"
__since__ = "0.1"
__date__ = "2010"
__license__ = "gpl3"
__copyright__ = """%s %s Copyright (C) %s %s
This program comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to redistribute it
under certain conditions; for details see LICENSE.txt.""" % (__prj__,
                                                            __version__,
                                                            __date__,
                                                             __author__)
                                                             
################################################################################
# CONSTANTS
################################################################################

_OPT_PARSER = optparse.OptionParser("usage: %s [option] server [user] %s\n\n%s"
                                    % (__prj__, __doc__, __copyright__),
                                    version=__version__)
_OPT_PARSER.add_option("-u", "--update", action="store", type="string",
                       dest="update", help="add or update server:user",
                       metavar="USER")
_OPT_PARSER.add_option("-r", "--remove", action="store", type="string",
                       dest="remove", help="remove server:user", metavar="USER")
_OPT_PARSER.add_option("-s", "--show", action="store_true", dest="show",
                       help="show a user:server without connecting")

_DATA_PATH = "/home/flor/MyDocuments/servers"
_DEFAULT_USER = "zanetma1"

################################################################################
# CLASSES
################################################################################

class ConnectError(BaseException):

    def __init__(self, msg, code):
        """Crea una nueva instancia de ConnectError

        @param msg: Mensaje de la exeption
        @param code: codigo de error para retornar al sistema operativo

        """
        self.msg = msg
        self.code = code
        super(ConnectError, self).__init__()

    def __str__(self):
        # cuando se hace 'str(instancia)' se llama a este metodo
        return self.msg

################################################################################
# FUNCTIONS
################################################################################


def main():
    count = 0
    options, args = _OPT_PARSER.parse_args()
    if options.update:
        count += 1
    if options.remove:
        count += 1
    if options.show:
        count += 1
    
    if count > 1:
        raise ConnectError("Options -u, -r and -s are mutually exclusive", 1)
        
    if not args:
        raise ConnectError("Enter a server!", 2)
    elif len(args) > 2:
        raise ConnectError("Unknown argument", 3)
    
    if os.path.isfile(_DATA_PATH):
        f = open(_DATA_PATH, "r")
        servers = pickle.load(f)
    elif options.update:
        servers = {}
    elif args[1]:
        pass
    else:
        msg = "File %s doesn't exist" % _DATA_PATH
        raise ConnectError(msg, 4)
    
    if options.update:
        servers[args[0]] = options.update
        f = open(_DATA_PATH, "w")
        pickle.dump(servers, f)
        
    if options.remove:
        servers.pop(args[0])
        f = open(_DATA_PATH, "w")
        pickle.dump(servers, f)
        
    if options.show:
        print (servers.get(args[0]) + "@" + args[0])
    
    if count == 0:
    
        if len(args) == 2:
            cmd = "script -c \"tsocks ssh %s@%s\" " % (args[1], args[0])
    
        elif servers.get(args[0]): #por si es nulo el par
            cmd = "script -c \"tsocks ssh %s@%s\" " % (servers.get(args[0]),
                                                         args[0]) 
        else:
            msg = "No user determined for the requested server\n"
            msg += "Trying default (will not be saved): %s" % _DEFAULT_USER
            print(msg)
            cmd = "script -c \"tsocks ssh %s@%s\" " % (_DEFAULT_USER, args[0]) 

        cmd += "-a /home/flor/log/$(date +%Y-%m-%d_%T)-" + args[0] + ".log"
        print(cmd)
        os.system(cmd)
        
        
    
        
################################################################################
# MAIN
################################################################################


if __name__ == "__main__":
    main()
    
    
    
